package cn.lg.soar.activiti.api.model;

import cn.lg.soar.activiti.api.utils.ProcessUtil;
import lombok.Getter;
import lombok.Setter;

import javax.validation.constraints.NotBlank;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @author luguoxiang
 * 开源项目：https://gitee.com/lgx1992/lg-soar 求star！请给我star！请帮我点个star！
 */
@Getter
@Setter
public class CompleteTaskDTO {

    /**
	 * 任务id
	 */
	@NotBlank(message = "任务id不能为空")
	private String taskId;

	/**
     * 审批意见
	 */
	private String comment;

	/**
     * 变量
	 */
	private Map<String, Object> variables;

	/**
	 * 设置下个节点候选人（下个节点只有一个时使用）
	 * 候选人，用户：username，角色：R:roleCode，组织机构：O:orgId
	 */
	private List<String> candidates;

	/**
	 * 设置多个节点候选人（下个节点有多个时使用）
	 * Map<节点key, 候选人>
	 * 候选人，用户：username，角色：R:roleCode，组织机构：O:orgId
	 */
	private Map<String, List<String>> taskCandidates;

	/**
	 * 添加变量
	 * @param key
	 * @param value
	 */
	public void addVariable(String key, Object value) {
		if (variables == null) {
			variables = new HashMap<>();
		}
		variables.put(key, value);
	}

	/**
	 * 添加候选人
	 * @param candidate 候选人，用户：username，角色：R:roleCode，组织机构：O:orgId
	 */
	public void addCandidate(String candidate) {
		if (candidates == null) {
			candidates = new ArrayList<>();
		}
		candidates.add(candidate);
	}

	/**
	 * 添加候选人
	 * @param nodeKey 节点key
	 * @param candidate 候选人，用户：username，角色：R:roleCode，组织机构：O:orgId
	 */
	public void addCandidate(String nodeKey, String candidate) {
		if (taskCandidates == null) {
			taskCandidates = new HashMap<>();
		}
		taskCandidates.computeIfAbsent(nodeKey, k -> new ArrayList<>()).add(candidate);
	}

	/**
	 * 添加候选角色
	 * @param role 角色
	 */
	public void addCandidateRole(Serializable role) {
		addCandidate(ProcessUtil.roleToCandidate(role));
	}

	/**
	 * 添加候选角色
	 * @param nodeKey 节点key
	 * @param role 角色
	 */
	public void addCandidateRole(String nodeKey, Serializable role) {
		addCandidate(nodeKey, ProcessUtil.roleToCandidate(role));
	}

	/**
	 * 添加候选机构
	 * @param org 机构
	 */
	public void addCandidateOrg(Serializable org) {
		addCandidate(ProcessUtil.orgToCandidate(org));
	}

	/**
	 * 添加候选机构
	 * @param nodeKey 节点key
	 * @param org 机构
	 */
	public void addCandidateOrg(String nodeKey, Serializable org) {
		addCandidate(nodeKey, ProcessUtil.orgToCandidate(org));
	}

}
